<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	/**
	 * 实现两个大整数（字符串形式）相加的函数
	 * 用于处理超过 JavaScript 数值精度范围的大数加法，避免精度丢失问题
	 *
	 * @param {string} num1 - 第一个大整数字符串
	 * @param {string} num2 - 第二个大整数字符串
	 * @returns {string} 相加结果，以字符串形式返回
	 */
	function addBigNumber(num1, num2) {
		// 输入校验：确保num1和num2均为纯数字组成的字符串
		if (!/^\d+$/.test(num1) || !/^\d+$/.test(num2)) return ''

		// 将字符串转换为字符数组，并反转顺序以便从个位开始计算
		const arr1 = num1.split('').reverse()
		const arr2 = num2.split('').reverse()

		const result = [] // 存储每一位相加的结果
		let carry = 0 // 进位值

		// 获取较长的数组长度，确保所有位数都被处理
		const maxLength = Math.max(arr1.length, arr2.length)

		// 按位相加
		for (let i = 0; i < maxLength; i++) {
			// 取当前位的数字，若已超出原数长度则补0
			const n1 = i < arr1.length ? parseInt(arr1[i]) : 0
			const n2 = i < arr2.length ? parseInt(arr2[i]) : 0

			// 计算当前位的和，并更新进位值
			const sum = n1 + n2 + carry
			carry = Math.floor(sum / 10) // 向下取整获取进位值
			result.push(sum % 10) // 当前位保留余数
		}

		// 如果最后还有进位，则添加到结果中
		if (carry > 0) {
			result.push(carry)
		}

		// 反转结果数组并转换为字符串，去除前导零
		const finalStr = result.reverse().join('')
		return finalStr.replace(/^0+/, '') || '0'
	}


	// 基础用例
	console.log(addBigNumber("123", "456"));            // "579"
	console.log(addBigNumber("999", "999"));            // "1998"

	// 进位边界测试
	console.log(addBigNumber("555", "555"));            // "1110"
	console.log(addBigNumber("999999999999999999", "1")); // "1000000000000000000"

	// 不同长度测试
	console.log(addBigNumber("12345", "678"));          // "13023"
	console.log(addBigNumber("7", "8"));                // "15"

	// 特殊场景测试
	console.log(addBigNumber("0", "0"));                // "0"
	console.log(addBigNumber("000123", "456"));         // "579"（自动处理前导零）
	console.log(addBigNumber("12a3", "456"));           // ""（非法输入处理）

</script>
</html>
